package org.liang.job.repository;

import java.util.List;
import java.util.Map;

import org.liang.jdbc.repository.BaseRepository;
import org.liang.job.common.IDBuilder;

/**
 * 自动任务相关组数据库操作.
 * 
 * <pre>
 * 任务组，触发器组父类 
 * 所有子类表结构一致但表名不同，故抽象出此类进行统一维护
 * </pre>
 * 
 * @author L.Yang
 * @version 1.0, 2015年9月23日
 */
public abstract class GroupRepository extends BaseRepository {

    /**
     * 判断是否已经存在 组名称.
     * 
     * @param 组名称
     * @return 是否已存在
     */
    public boolean isNameExist(String name) {
        String sql = "select t.ID from " + getTableName() + " t where t.NAME = ?";
        List<String> datas = getJdbcTemplate().queryForList(sql, String.class, name);
        return (datas != null && !datas.isEmpty());
    }

    /**
     * 判断是否存在引用.
     * 
     * @param name
     *            组名称
     * @return 是否被引用
     */
    public abstract boolean hasReference(String id);


    /**
     * 过滤出被引用的编号.
     * 
     * @param ids
     *            要过滤的编号
     * @return 存在引用的编号
     */
    public abstract List<String> filterReferences(List<String> ids);


    /**
     * 获取所有组信息.
     * 
     * @return 所有组信息列表
     */
    public List<Map<String, Object>> queryAll() {
        String sql = "select t.ID,t.NAME from " + getTableName() + " t";
        return getJdbcTemplate().queryForList(sql);
    }

    /**
     * 根据名称获取组信息（模糊查询）.
     * 
     * @param name
     *            名称
     * @return 符合标准的组信息
     */
    public List<Map<String, Object>> query(String name) {
        String sql = "select t.ID,t.NAME from " + getTableName() + " t where t.NAME like '%?%'";
        return getJdbcTemplate().queryForList(sql, name);
    }

    /**
     * 保存组.
     * 
     * @param name
     *            组名称
     * @return 影响记录数
     */
    public int save(String name) {
        String sql = "insert into " + getTableName() + " (id, name) values "
                     + buildPreparedStatement4Args(2);
        return getJdbcTemplate().update(sql, new Object[] {IDBuilder.buildUniqueID(name), name});
    }

    /**
     * 更新组信息.
     * 
     * @param id
     *            组编号
     * @param name
     *            组名称
     * @return 影响记录数
     */
    public int update(String id, String name) {
        String sql = "update " + getTableName() + " t set t.NAME = ? where t.ID=?";
        return getJdbcTemplate().update(sql, new Object[] {name, id});
    }

    /**
     * 根据组编号 删除组信息.
     * 
     * @param ids
     *            组编号集合
     * @return 影响记录数
     */
    public int delete(String id) {
        String sql = "delete from " + getTableName() + " where id = ? ";
        
        return getJdbcTemplate().update(sql, id);
    }

    /**
     * 根据组编号 批量删除组信息.
     * 
     * @param ids
     *            组编号集合
     * @return 影响记录数
     */
    public int delete(List<String> ids) {
        if (ids.isEmpty()) return 0;
        String sql = "delete from " + getTableName() + " where id in "
                     + buildPreparedStatement4Args(ids.size());
        return getJdbcTemplate().update(sql, ids.toArray());
    }

    /** 获取组表 表名. */
    protected abstract String getTableName();

}
